\indent La funcionalidad de este filtro consisite en tomar una imagen a color y aplicarle un filtro de colorizaci\'on, descripto en la secci\'on de introducci\'on. La idea de este filtro es resaltar los m\'aximos de los canales RGB que tiene una imagen.

\indent Dado a que una imagen a color esta compuesta por 3 canales $Red$ $Green$ $Blue$ por cada pixel y las operaciones sobre ellos requieren una conversi\'on a punto flotante solamente vamos a procesar de a un pixel a la vez.

\indent La idea del algoritmo es cargar 3 filas de pixeles sucesivas, la $i-1$, $i$, $i+1$, y obtener los m\'aximos valores de R-G-B, una vez obtenidos los valores m\'aximos por canal, calculamos la funci\'on $chi$ para cada uno de ellos. Para finalizar por cada canal, tomamos el m\'inimo entre el resultado de $chi$ * $el pixel de destino$ y $255.0$ y lo copiamos en la imagen destino.

\indent Es necesario mencionar que la primera y \'ultima fila no seran procesadas, lo mismo sucede con la primera y \'ultima columna


\subsubsection{Sección .data}

\indent Definimos varias constantes en la sección .data (por ende son constantes inicializadas) repetidas 4 veces en el caso de números flotantes, para luego poder cargar dichos valores en registros $xmm0$:
\begin{itemize}
\item RRRGGGBBB: db 0, 3, 6, 255, 1, 4, 7, 255, 2, 5, 8, 255, 255, 255, 255, 255 : es una m\'ascara para acomodar los canales de la forma xmmx: 0 RRR GGG BBB.
\item RGB: db 0, 255, 255, 255, 4, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255: es una m\'ascara para acomodar los canales de la forma xmmx: 0 R G B.
\item DOSCINCOCINCO: dd 255.0, 255.0, 255.0, 0: Esta constante corresponde al 255.0. 
\item UNO: dd 1.0 : Esta constante corresponde al valor 1.0.
\item UmascaraFinal: db 7, 8, 9, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255: es una m\'ascara para acomodar la ultima fila.
\item CHNPXL: db 0, 4, 8, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25: es una m\'ascara para armar un pixel.
\end{itemize}


\subsubsection{Carga de datos}

\indent En la carga inicial de datos incluimos el c\'omputo de la funci\'on 1.0 + alfa y 1 - alfa, la principal motivaci\'on es que al hacerlo fuera del ciclo principal, solo lo computamos una vez y el resultado lo usamos en cada iteraci\'on del ciclo.

\indent La carga de datos inicial para el ciclo principal del algoritmo es:


\begin{itemize}
\item Copiamos en $XMM4$ y $XMM5$  la m\'ascara $UNO$
\item Sumamos a $XMM4$ el valor de alfa, que viene en el registro $XMM0$, obteniendo el resultado de la suma en la parte baja. El registro queda

  	\begin{center}
   		 $xmm4$ = \xmmxDWord {$0$}{$0$}{$0$}{$1+alfa$}
  	\end{center}

\item Restamos a $XMM5$ el valor de alfa, que viene en el registro $XMM0$, obteniendo el resultado de la resta en la parte baja. El registro queda:

  	\begin{center}
   		 $xmm5$ = \xmmxDWord {$0$}{$0$}{$0$}{$1-alfa$}
  	\end{center}

\item Copiamos en $XMM6$ la m\'ascara $DOSCINCOCINCO$
\item Calculamos en $R15$ la fila donde comenzar a leer los datos, la fila $i-1$
\item Calculamos en $R14$ el pixel a modificar para el resultado final
\item Copiamos en $XMM7$ el pixel a modificar, y le aplicamos la m\'ascara para convertirlo a $Float$

  	\begin{center}
   		 $xmm7$ = \xmmxDWord {$0$}{$R$}{$G$}{$B$}
  	\end{center}

\item Inicializamos $R10$ en 3 para utilizarlo como contador de columnas
\item Inicializamos $R11$ en 0 para utilizarlo como contador de filas
\item Preservamos en $R12$ m y lo usamos para saber cu\'ando terminamos una fila
\item Preservamos en $R13$ n y lo usamos para saber cu\'ando terminamos una columna
\end{itemize}

\subsubsection{Ciclo Principal}


\indent Con los datos cargados en los registros vamos a mostrar una iteraci\'on del ciclo principal del filtro. Para cada l\'inea de la matriz que representa la imagen fuente se realizan las siguientes acciones.

\begin{itemize}
\item Leemos desde la imagen fuente en $RDI$ 16 bytes, utilizando $R15$ y los cargamos en $XMM1$, cargando aqui la fila $i - 1$ 
\item Sumamos $R15$ + \textit{row size} para avanzar a la siguiente fila.
\item Copiamos en $XMM2$ la fila i. 
\item Sumamos $R15$ + \textit{row size} para avanzar a la siguiente fila.
\item Copiamos en $XMM3$ la fila $i+1$.
\item Necesitamos separar los canales de los datos cargados para poder realizar las operaciones del algoritmos sobre cada canal, entonces a cada registro le aplicamos la funci\'on $PSHUFB$ con la m\'ascara $RGB$. Los registros quedan:

  	\begin{center}
   		 $xmm1$ = \xmmxDWord {$0$}{$0RRR$}{$0GGG$}{$0BBB$}
  	\end{center}


\item Calculamos el m\'aximo por columna comparando con la funci\'on $PMAXUB$, guardando los m\'aximos en $XMM1$, quedando el registro

  	\begin{center}
   		 $xmm1$ = \xmmxDWord {$0$}{$0RRR$}{$0GGG$}{$0BBB$}
  	\end{center}

\item En $XMM1$ obtuvimos los m\'aximos por columna, ahora necesitamos los m\'aximos definitivos. Para esto copiamos en $XMM13$, $XMM14$ y $XMM15$ el registro $XMM1$,  shifteando registros obtenemos un solo valor por canal, los registros quedan de la forma: 

  	\begin{center}
   		 $xmm13$ = \xmmxDWord {$0$}{$000R$}{$000G$}{$000B$}
  	\end{center}
 
\item De nuevo con la funci\'on $PMAX$ obtenemos los m\'aximos de cada canal en $XMM13$

  	\begin{center}
   		 $xmm13$ = \xmmxDWord {$0$}{$maxR$}{$maxG$}{$maxB$}
  	\end{center}

\item Para poder calcular la funci\'on $chi$ bajamos a registros los m\'aximos obtenidos, mediante $pshufd$ bajamos los resultados a regisitros de prop\'osito general
\item Realizamos la comparaciones de la funci\'on $chi$ y guardamos los resultados en los registros $XMM8$, $XMM9$, $XMM10$, estos registros solo tienen valores de $1 + alfa$ o $1-alfa$ segun corresponda. Cada uno de estos registros quedo de la forma:

  	\begin{center}
   		 $xmm8$ = \xmmxDWord {$0$}{$0$}{$0$}{$chiB$}
  	\end{center}

\item Mediante operaciones de shifteo y sumas agrupamos en un solo registro los valores obtenidos en $chi$ para cada canal

  	\begin{center}
   		 $xmm8$ = \xmmxDWord {$0$}{$chiR$}{$chiG$}{$chiB$}
  	\end{center}

\item Multiplicamos $XMM8$ con $XMM7$ que ten\'ia el pixel a modificar, guardamos el resultado en $XMM7$

  	\begin{center}
   		 $xmm7$ = \xmmxDWord {$0$}{$chiR * R$}{$chiG * G$}{$chiB * B$}
  	\end{center}

\item Comparamos con el registro $XMM6$ que tenia la m\'ascara de 255.0 y guardamos el resultado en $XMM7$

  	\begin{center}
   		 $xmm7$ = \xmmxDWord {$0$}{$R$}{$G$}{$B$}
  	\end{center}

\item Lo convertimos de pixel y copiamos el resultando en $dst$

  	\begin{center}
   		 $xmm8$ = \xmmxDWord {$000$}{$000$}{$000$}{$0RGB$}
  	\end{center}

\end{itemize}
